package controlmercancias.dominio;

import java.util.regex.Pattern;

/**
 * Clase coordenada que contiene los atributos y los metodos para trabajar con coordenadas.
 * @author Hasier
 */
public class Coordenada {
 
    /**
     * Atributo de clase que contiene la latitud.
     */
    private String lat;
    /**
     * Atributo de clase que contiene la longitud.
     */
    private String lon;
    
    /**
     * Constructor con parámetros.
     * @param latitud
     * @param longitud
     */
    public Coordenada(String lat, String lon) {
        setLatitude(lat);
        setLongitude(lon);
    }

    /**
     * Retorna true si el formato es valido.
     * @param matching
     * @return retorna true si el valido.
     */
    private boolean match(String matching) {
        return Pattern.matches("[0-9]{1,2}º[0-5]?[0-9]'[0-5]?[0-9].?[0-9]{0,2}''", matching);
    }

    /**
     * retorna la latitud.
     * @return latitud
     */
    public String getLatitude() {
        return lat;
    }

    /**
     * Modifica la latitud.
     * @param latatitud
     */
    public void setLatitude(String lat) {
        if (lat == null) {
            throw new NullPointerException("La latitud no puede ser nula");
        }
        if (lat.trim().equals("")) {
            throw new IllegalArgumentException("La latitud no puede ser cadena vacía");
        }
        boolean match = match(lat);
        if (match) {
            this.lat = lat;
        } else {
            throw new IllegalArgumentException("El formato del argumento '" + lat + "' no es válido");
        }
    }

    /**
     * Retorna la longitud.
     * @return longitud
     */
    public String getLongitude() {
        return lon;
    }

    /**
     * Modifica la longitud.
     * @param longitud
     */
    public void setLongitude(String lon) {
        if (lon == null) {
            throw new NullPointerException("La longitud no puede ser nula");
        }
        if (lon.trim().equals("")) {
            throw new IllegalArgumentException("La longitud no puede ser cadena vacía");
        }
        boolean match = match(lon);
        if (match) {
            this.lon = lon;
        } else {
            throw new IllegalArgumentException("El formato del argumento '" + lon + "' no es válido");
        }
        this.lon = lon;
    }
    
    /**
     * Genera coordenada aleatorias.
     * @return Coordenada
     */
    public static Coordenada generateCoordenada() {
    	String lon = "";
    	lon += ((int) (Math.random() * 99)) + "º";
    	lon += ((int) (Math.random() * 59)) + "'";
    	lon += ((int) (Math.random() * 59)) + "''";
    	String lat = "";
    	lat += ((int) (Math.random() * 99)) + "º";
    	lat += ((int) (Math.random() * 59)) + "'";
    	lat += ((int) (Math.random() * 59)) + "''";
    	return new Coordenada(lat, lon);
    }

    @Override
    public String toString() {
        return lat + "-" + lon;
    }
}
